package cn.spike.system.service.impl;

import cn.spike.basic.query.BaseQuery;
import cn.spike.basic.util.PageList;
import cn.spike.system.domain.Menu;
import cn.spike.system.domain.Role;
import cn.spike.system.mapper.MenuMapper;
import cn.spike.system.mapper.RoleMapper;
import cn.spike.system.service.IRoleService;
import cn.spike.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 业务实现类：
 */
@Service
public class RoleServiceImpl extends BaseServiceImpl<Role> implements IRoleService {

    @Autowired
    private RoleMapper roleMapper;

    @Override
    @Transactional
    public void add(Role role) {
        //先添加角色id 获取角色的自增id
        super.add(role);

        //添加角色菜单中间表数据
        //判断前端传来的菜单数组 不为空 不是空数组
        if(role.getMenus()!=null && role.getMenus().size()>0){
            roleMapper.addRoleMenu(role.getId(),role.getMenus());
        }
        //添加角色权限中间表数据
        //判断前端传来的权限数组 不为空 不是空数组
        if(role.getPermissions()!=null && role.getPermissions().size()>0){
            roleMapper.addRolePermissions(role.getId(),role.getPermissions());
        }
    }


    @Override
    @Transactional
    public void delete(Long id) {
        //删除先删除角色中间的外键
        //删除角色菜单中间表数据
        roleMapper.delRoleMenuByRoleId(id);
        //删除角色权限中间表数据
        roleMapper.delRolePermissionByRoleId(id);
        //删除员工角色中间表数据
        roleMapper.delEmployeeRoleByRoleId(id);
        //再删除角色
        super.delete(id);
    }


    @Override
    @Transactional
    public void update(Role role) {
        //中间表数据 先删除再修改
        //删除角色菜单中间表数据
        roleMapper.delRoleMenuByRoleId(role.getId());
        //删除角色权限中间表数据
        roleMapper.delRolePermissionByRoleId(role.getId());

        //添加角色菜单中间表数据
        //判断前端传来的菜单数组 不为空 不是空数组
        if(role.getMenus()!=null && role.getMenus().size()>0){
            roleMapper.addRoleMenu(role.getId(),role.getMenus());
        }
        //添加角色权限中间表数据
        //判断前端传来的权限数组 不为空 不是空数组
        if(role.getPermissions()!=null && role.getPermissions().size()>0){
            roleMapper.addRolePermissions(role.getId(),role.getPermissions());
        }
        //最后修改角色的数据
        super.update(role);
    }


    @Override
    @Transactional
    public void patchDelete(List<Long> ids) {
        for (Long id : ids) {
            delete(id);
        }
    }

    @Override
    public PageList<Role> pageQuery(BaseQuery baseQuery) {
        PageList<Role> rolePageList = super.pageQuery(baseQuery);
        //获取到这一个的所有role对象
        List<Role> data = rolePageList.getData();
        for (Role role : data) {
            List<Long> permissions = roleMapper.loadRolePermissionByRoleId(role.getId());
            role.setPermissions(permissions);
        }






        rolePageList.setData(data);
        return rolePageList;
    }
}
